using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading;
using System.Windows.Forms;
using Sesi.Dados.Entidades;
using Sesi.Dados.Enumeradores;
using Sesi.Negocio;
using Sesi.Repositorio;
using Sesi.Utils;
using SR.SuperCash.Utils;

namespace Sesi.Servico
{
    public class Fachada
    {
        #region Atributos

        private static Fachada _unique = null;
        private CadastroPalestras _cadastroPalestras;
        private CadastroParticipante _cadastroParticipante;

        #endregion

        #region GetInstancia

        public static Fachada GetInstancia()
        {
            if (_unique == null)
            {
                _unique = new Fachada();
            }
            return _unique;
        }

        #endregion

        #region Construtor
        public Fachada()
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");

            _cadastroPalestras = new CadastroPalestras();
            _cadastroParticipante = new CadastroParticipante();

        }
        #endregion

        #region CadastroParticipantes

        public Participante Inserir(Participante participante, ref bool tudoCerto)
        {
            Participante participantetmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                participantetmp = _cadastroParticipante.Inserir(participante);
                GerenciadorBD.Instance.ConfirmarTransacao();
                GerenciadorBD.Instance.FecharSessao();
                tudoCerto = true;
            }
            catch (Exception ex)
            {
                participantetmp = null;
                GerenciadorBD.Instance.CancelarTransacao();
                tudoCerto = false;
                new TratamentoExcecoes(ex, MessageBoxButtons.OK, MessageBoxIcon.Error);
                //throw;
            }

            return participantetmp;
        }

        public Participante Atualizar(Participante participante, ref bool tudoCerto)
        {
            Participante participantetmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                participantetmp = _cadastroParticipante.Atualizar(participante);
                GerenciadorBD.Instance.ConfirmarTransacao();
                GerenciadorBD.Instance.FecharSessao();
                tudoCerto = true;
            }
            catch (Exception ex)
            {
                
                participantetmp = null;
                GerenciadorBD.Instance.CancelarTransacao();
                tudoCerto = false;
                new TratamentoExcecoes(ex, MessageBoxButtons.OK, MessageBoxIcon.Error);
                //throw;
            }

            return participantetmp;
        }

        public void ExcluirParticipantes(int id, ref bool tudoCerto)
        {
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                _cadastroParticipante.Excluir(id);
                GerenciadorBD.Instance.ConfirmarTransacao();
                GerenciadorBD.Instance.FecharSessao();
                tudoCerto = true;
            }
            catch (Exception ex)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                tudoCerto = false;
                new TratamentoExcecoes(ex, MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw;
            }
          
        }

        public IList<Participante> ObterTodosParticipantes()
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ObterTodos();
        }

        public Participante ObterParticipantesPorId(int id)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ObterPorId(id);
        }

        public IList<Participante> ObterTodosPorPalestra(Palestras palestra)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ObterTodosPorPalestra(palestra);
        }

        public int ObterQuantidadeTodosPorPalestra(Palestras palestra)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ObterQuantidadeTodosPorPalestra(palestra);
        }

        public int QuantidadeParticipantesPorPalestra(Palestras palestra)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.QuantidadeParticipantesPorPalestra(palestra);
        }

        public int ParticipantesPorSalaTematica(Palestras salatematica)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ParticipantesPorSalaTematica(salatematica);
        }

        public int ParticipantesPorConfAbertura(Palestras confAbertura)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ParticipantesPorConfAbertura(confAbertura);
        }

        public int ParticipantesPorConfEncerramento(Palestras confEncerramento)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ParticipantesPorConfEncerramento(confEncerramento);
        }

        public int ParticipantesPorMesaRedonda(Palestras mesaRedonda)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ParticipantesPorMesaRedonda(mesaRedonda);
        }

        public IList<Participante> ObterParticipantesPorConfAbertura(Palestras confAbertura)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ObterParticipantesPorConfAbertura(confAbertura);
        }

        public IList<Participante> ObterParticipantesPorMesaRedonda(Palestras mesaRedonda)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ObterParticipantesPorMesaRedonda(mesaRedonda);
        }

        public IList<Participante> ObterParticipantesPorConfEncerramento(Palestras confEncerramento)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ObterParticipantesPorConfEncerramento(confEncerramento);
        }

        public IList<Participante> ObterParticipantesPorSalaTematica(Palestras salatematica)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroParticipante.ObterParticipantesPorSalaTematica(salatematica);
        }

        #endregion

        #region CadastroPalestras

        public Palestras Inserir(Palestras palestras)
        {
            Palestras palestrastmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                palestrastmp = _cadastroPalestras.Inserir(palestras);
                GerenciadorBD.Instance.ConfirmarTransacao();
                GerenciadorBD.Instance.FecharSessao();
            }
            catch (Exception ex)
            {
                palestrastmp = null;
                GerenciadorBD.Instance.CancelarTransacao();
                new TratamentoExcecoes(ex, MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw;
            }

            return palestrastmp;
        }

        public Palestras Atualizar(Palestras palestras)
        {
            Palestras palestrastmp;
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                palestrastmp = _cadastroPalestras.Atualizar(palestras);
                GerenciadorBD.Instance.ConfirmarTransacao();
                GerenciadorBD.Instance.FecharSessao();
            }
            catch (Exception ex)
            {
                palestrastmp = null;
                GerenciadorBD.Instance.CancelarTransacao();
                new TratamentoExcecoes(ex, MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw;
            }

            return palestrastmp;
        }

        public void ExcluirPalestra(int id)
        {
            GerenciadorBD.Instance.IniciarTransacao();
            try
            {
                _cadastroPalestras.Excluir(id);
                GerenciadorBD.Instance.ConfirmarTransacao();
                GerenciadorBD.Instance.FecharSessao();
            }
            catch (Exception ex)
            {
                GerenciadorBD.Instance.CancelarTransacao();
                new TratamentoExcecoes(ex, MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw;
            }
        }

        public IList<Palestras> ObterTodosPalestras()
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroPalestras.ObterTodos();
        }

        public Palestras ObterPalestrasPorId(int id)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroPalestras.ObterPorId(id);
        }

        public IList<Palestras> ObterTodasPalestrasPorTipo(TipoPalestra tipoPalestra)
        {
            GerenciadorBD.Instance.FecharSessao();
            return _cadastroPalestras.ObterTodasPalestrasPorTipo(tipoPalestra);
        }

        #endregion
    }
}